package com.seeyon.apps.nygj.util;

import com.seeyon.cap4.form.bean.*;
import com.seeyon.cap4.form.modules.engin.base.formData.CAP4FormDataManager;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.ModuleType;
import com.seeyon.ctp.common.authenticate.domain.User;
import com.seeyon.ctp.common.content.mainbody.CtpContentAllBean;
import com.seeyon.ctp.common.content.mainbody.MainbodyService;
import com.seeyon.ctp.common.content.mainbody.MainbodyStatus;
import com.seeyon.ctp.common.content.mainbody.MainbodyType;
import com.seeyon.ctp.common.ctpenum.dao.cache.CtpEnumItemCache;
import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.common.po.content.CtpContentAll;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;
import com.seeyon.ctp.organization.bo.V3xOrgDepartment;
import com.seeyon.ctp.organization.bo.V3xOrgMember;
import com.seeyon.ctp.organization.manager.OrgManager;
import com.seeyon.ctp.util.DateUtil;
import com.seeyon.ctp.util.Strings;
import com.seeyon.ctp.util.UUIDLong;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;

public class FormCap4Kit {

    private static final Log log = CtpLogFactory.getLog(FormCap4Kit.class);

    private static OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
    private static EnumManager enumManager = (EnumManager) AppContext.getBean("enumManagerNew");
    private static CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private static CAP4FormDataManager cap4FormDataManager = (CAP4FormDataManager) AppContext.getBean("cap4FormDataManager");
    private static CtpEnumItemCache ctpEnumItemCache = (CtpEnumItemCache) AppContext.getBean("ctpEnumItemCache");
    /**
     * 根据表单主数据对象和显示名称，获取对应的字段值
     *
     * @param formDataMasterBean 表单主数据对象
     * @param disPlay            显示名称
     * @return 对应字段的值，如果不存在则返回null
     */
    public static Object getMasterFieldValue(FormDataMasterBean formDataMasterBean, String disPlay) {
        // 如果formDataMasterBean为空，则返回null
        if (formDataMasterBean == null) {
            return null;
        }

        // 获取formDataMasterBean中的formTableBean
        FormTableBean formTableBean = formDataMasterBean.getFormTable();

        // 如果formTableBean为空，则返回null
        if (formTableBean == null) {
            return null;
        }

        // 根据display获取formTableBean中的FormFieldBean
        FormFieldBean formFieldBean = formTableBean.getFieldBeanByDisplay(disPlay);

        // 如果formFieldBean为空，则返回null
        if (formFieldBean == null) {
            return null;
        }

        // 返回formDataMasterBean中的formFieldBean的值
        return formDataMasterBean.getFieldValue(formFieldBean.getName());

    }


    /**
     * 根据表单数据对象获取主表单字段的值
     *
     * @param formDataMasterBean 表单数据对象
     * @return 字段值的映射集合
     */
    public static Map<String, Object> getMasterFieldValue(FormDataMasterBean formDataMasterBean) throws Exception {
        Map<String, Object> fieldValueMap = new HashMap<String, Object>();

        // 如果formDataMasterBean为空，则返回null
        if (formDataMasterBean == null) {
            return fieldValueMap;
        }

        // 获取表单字段列表
        List<FormFieldBean> formFieldBeans = formDataMasterBean.getFormTable().getFields();

        // 遍历字段列表
        for (FormFieldBean formFieldBean : formFieldBeans) {
            String desc = str(formFieldBean.getDesc());
            if (!"".equals(desc)) {
                String fieldValue = str(formDataMasterBean.getFieldValue(formFieldBean.getName()));
                fieldValueMap.put(desc, dataConversion(formFieldBean, fieldValue));
            }
        }
        return fieldValueMap;
    }


    /**
     * 根据显示名称获取子表单列表
     *
     * @param formDataMasterBean 主表单对象
     * @param disPlay            显示名称
     * @return 子表单列表，如果不存在匹配的子表单则返回null
     */
    public static List<FormDataSubBean> getSubBeansByDisplay(FormDataMasterBean formDataMasterBean, String disPlay) {
        // 获取formDataMasterBean中的子表单列表
        Map<String, List<FormDataSubBean>> subs = formDataMasterBean.getSubTables();
        // 判断子表单列表是否不为空且子表单数量大于0
        if (null != subs && subs.size() > 0) {
            // 遍历子表单列表的key
            for (String key : subs.keySet()) {
                // 判断当前子表单的显示值是否与指定的显示值相等
                if (disPlay.equals(subs.get(key).get(0).getFormTable().getDisplay())) {
                    // 如果相等，则返回该子表单列表
                    return subs.get(key);
                }
            }
        }
        // 如果没有找到匹配的子表单列表，则返回null
        return null;

    }
    public static Object getSubFieldValue(FormDataSubBean formDataSubBean, String disPlay) {
        // 如果formDataMasterBean为空，则返回null
        if (formDataSubBean == null) {
            return null;
        }

        // 获取formDataMasterBean中的formTableBean
        FormTableBean formTableBean = formDataSubBean.getFormTable();

        // 如果formTableBean为空，则返回null
        if (formTableBean == null) {
            return null;
        }

        // 根据display获取formTableBean中的FormFieldBean
        FormFieldBean formFieldBean = formTableBean.getFieldBeanByDisplay(disPlay);

        // 如果formFieldBean为空，则返回null
        if (formFieldBean == null) {
            return null;
        }

        // 返回formDataMasterBean中的formFieldBean的值
        return formDataSubBean.getFieldValue(formFieldBean.getName());

    }


    /**
     * 获取表单子对象的字段值
     *
     * @param formDataSubBean 表单子对象
     * @return 字段值的Map集合
     */
    public static Object getSubFieldValue(FormDataSubBean formDataSubBean) throws Exception {
        Map<String, Object> fieldValueMap = new HashMap<String, Object>();

        // 如果formDataSubBean为空，则返回null
        if (formDataSubBean == null) {
            return fieldValueMap;
        }

        // 获取表单字段列表
        List<FormFieldBean> formFieldBeans = formDataSubBean.getFormTable().getFields();

        // 遍历字段列表
        for (FormFieldBean formFieldBean : formFieldBeans) {
            String desc = str(formFieldBean.getDesc());
            if (!"".equals(desc)) {
                String fieldValue = str(formDataSubBean.getFieldValue(formFieldBean.getName()));
                fieldValueMap.put(desc, dataConversion(formFieldBean, fieldValue));
            }
        }
        return fieldValueMap;
    }


    /**
     * 添加无流程表单数据
     *
     * @param formDataMasterBean 表单主数据
     * @param formBean           表单数据
     */
    public static void addUnFlowFormDataCap4(FormDataMasterBean formDataMasterBean, FormBean formBean) {
        try {
            // 获取当前用户ID
            User user = AppContext.getCurrentUser();
            Long userId = null;
            if (user != null) {
                userId = user.getId();
            }
            if (userId == null) {
                userId = formBean.getCreatorId();
            }
            // 获取表单权限视图数据
            FormAuthViewBean formAuthViewBean = formBean.getNewFormAuthViewBeans().get(0);
            // 获取权限视图数据ID
            String rightid = String.valueOf(formAuthViewBean.getId());
            // 插入或更新表单主数据
            cap4FormDataManager.insertOrUpdateMasterData(formDataMasterBean);
            // 获取主数据ID
            Long masterId = formDataMasterBean.getId();
            // 正文内容保存
            int moduleType = getModuleTypeCap4(formBean);
            MainbodyService mainBodyService = MainbodyService.getInstance();
            // 获取正文内容
            CtpContentAll ctpContentAll = mainBodyService.getContent(moduleType, masterId);
            // 保存正文内容
            ctpContentAll = saveContentAllForFormCap4(ctpContentAll, masterId, userId, formBean, rightid);
            // 保存或更新正文内容
            mainBodyService.saveOrUpdateContentAll(ctpContentAll);
        } catch (Exception e) {
            log.error("新增无流程表单数据报错信息:", e);
        }
    }


    /**
     * 保存表单Cap4的CtpContentAll信息
     *
     * @param ctpContentAll 保存的CtpContentAll对象
     * @param masterId      主键ID
     * @param userid        用户ID
     * @param formBean      表单Bean对象
     * @param rightId       权限ID
     * @return 保存后的CtpContentAll对象
     * @throws BusinessException 无应用绑定时抛出该异常
     */
    private static CtpContentAll saveContentAllForFormCap4(CtpContentAll ctpContentAll, long masterId, long userid, FormBean formBean, String rightId) throws BusinessException {
        Timestamp timestamp = DateUtil.currentTimestamp();
        if (ctpContentAll != null) {
            ctpContentAll.setModifyId(userid);
            ctpContentAll.setModifyDate(timestamp);
            return ctpContentAll;
        }
        CtpContentAllBean content = new CtpContentAllBean();
        FormBindBean bindBean = formBean.getBind();
        if (bindBean != null) {
            content.setModuleTemplateId(bindBean.getId());
            Map<String, FormBindAuthBean> bindAuth = bindBean.getUnFlowTemplateMap();
            if (CollectionUtils.isEmpty(bindAuth.values())) {
                throw new BusinessException("无应用绑定");
            }
            for (FormBindAuthBean authBean : bindAuth.values()) {
                content.setTitle(authBean.getName());
            }
        }
        content.setModuleType(getModuleTypeCap4(formBean));
        content.setCreateId(userid);
        content.setCreateDate(timestamp);
        content.setSort(0);
        content.setId(UUIDLong.longUUID());
        content.setStatus(MainbodyStatus.STATUS_POST_SAVE);
        content.setContentType(Integer.valueOf(MainbodyType.FORM.getKey()));
        content.setContentTemplateId(formBean.getId());
        content.setContentDataId(masterId);
        content.setModuleId(masterId);
        content.setModifyDate(timestamp);
        content.setModifyId(userid);
        content.setRightId(rightId);
        return content.toContentAll();
    }

    /**
     * 根据表单类型获取模块类型
     *
     * @param formBean 表单Bean对象
     * @return 模块类型
     * @throws BusinessException 业务异常
     */
    private static int getModuleTypeCap4(FormBean formBean) throws BusinessException {
        int moduleType = 0;
        if (formBean.getFormType() == 6) {
            moduleType = ModuleType.cap4UnflowForm.getKey();
        }
        if (moduleType == 0) {
            log.warn("无效表类型");
            throw new BusinessException("内容保存失败");
        }
        return moduleType;
    }

    private static String str(Object o) {
        if (o == null) {
            // 如果传入的对象为空，则返回一个空字符串
            return "";
        }
        if (o instanceof String) {
            // 如果传入的对象是字符串类型，则将其返回
            return (String) o;
        }
        if (o instanceof Date) {
            // 如果传入的对象是日期类型，则将其转为字符串并使用指定格式进行格式化后返回
            return new SimpleDateFormat("yyyyMMdd").format((Date) o);
        }
        // 如果传入的对象不属于上述类型，则调用其toString()方法将其转为字符串后返回
        return o.toString();

    }


    private static Object dataConversion(FormFieldBean formFieldBean, Object fieldValue) throws Exception {
        Object value = "";
        String fieldValue_new = str(fieldValue);
        if ("".equals(fieldValue_new)) {
            return "";
        }
        String fieldType = formFieldBean.getInputType();
        if ("imageselect".equals(fieldType) || "radio".equals(fieldType) || "select".equals(fieldType)) {
            // 获取枚举项id
            CtpEnumItem ctpEnumItem = enumManager.getCtpEnumItem(Long.parseLong(fieldValue_new));
            String ctpEnumItemCode = str(ctpEnumItem.getEnumItemCode()).trim();
            if (!"".equals(ctpEnumItemCode)) {
                if (ctpEnumItemCode.contains("_")) {
                    value = ctpEnumItemCode.split("_")[1];
                }
            } else {
                value = ctpEnumItem.getShowvalue();
            }
        } else if ("department".equals(fieldType)) {
            if (!"".equals(fieldValue_new)) {
                // 根据部门编码获取部门id
                V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(fieldValue_new));
                value = str(v3xOrgDepartment.getCode());
            }
        } else if ("member".equals(fieldType)) {
            if (!"".equals(fieldValue_new)) {
                // 根据成员编码获取成员id
                V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(fieldValue_new));
                value = v3xOrgMember.getCode();
            }
        } else {
            value = fieldValue_new;
        }
        return value;
    }
    /**
     * 添加日志信息到表单中。
     *
     * @param memberId      创建人员的ID
     * @param interfaceName 接口名称
     * @param formCode      单据编号
     * @param enumItemCode  成功标识（枚举编码）
     * @param message       报文信息
     * @param returnMessage 返回信息
     * @throws BusinessException 业务异常
     */
    public static void addLogs(Long memberId, String interfaceName, String formCode, String enumItemCode, String message, String returnMessage) throws BusinessException {
        // 根据表单代码获取表单信息
        FormBean formBean = cap4FormManager.getFormByFormCode("RZDA_001");
        if (formBean == null) {
            log.info("日志档案表不存在或模版编码【RZDA_001】未维护");
        } else {
            // 创建表单数据的主实例
            FormDataMasterBean formDataMasterBean = FormDataMasterBean.newInstance(formBean);
            // 填充表单字段值
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("创建人员").getName(), memberId);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("创建日期").getName(), new Date());
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("接口名称").getName(), interfaceName);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("单据编号").getName(), formCode);
            Long enumId = getEnumByCode(enumItemCode).getId();
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("成功标识").getName(), enumId);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("报文信息").getName(), message);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("返回信息").getName(), returnMessage);
            // 将表单数据添加到未流程化表单数据中
            addUnFlowFormDataCap4(formDataMasterBean, formBean);
        }
    }
    public static void addLogczh(String formCode, String guid) throws BusinessException {
        // 根据表单代码获取表单信息
        FormBean formBean = cap4FormManager.getFormByFormCode("ZJBCL_01");
        if (formBean == null) {
            log.info("日志档案表不存在或模版编码【ZJBCL_01】未维护");
        } else {
            // 创建表单数据的主实例
            FormDataMasterBean formDataMasterBean = FormDataMasterBean.newInstance(formBean);
            // 填充表单字段值
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("主键").getName(), guid);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("单据编号").getName(), formCode);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("创建日期").getName(), new Date());


            // 将表单数据添加到未流程化表单数据中
            addUnFlowFormDataCap4(formDataMasterBean, formBean);
        }
    }

    public static void addLognc(String data, String guid,String memberid,String membername,String title) throws BusinessException {
        // 根据表单代码获取表单信息
        FormBean formBean = cap4FormManager.getFormByFormCode("NCZJ_01");
        if (formBean == null) {
            log.info("日志档案表不存在或模版编码【NCZJ_01】未维护");
        } else {
            // 创建表单数据的主实例
            FormDataMasterBean formDataMasterBean = FormDataMasterBean.newInstance(formBean);
            // 填充表单字段值
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("主键").getName(), guid);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("发送时间").getName(), data);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("人员id").getName(), memberid);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("人员登录名").getName(), membername);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("标题").getName(), title);


            // 将表单数据添加到未流程化表单数据中
            addUnFlowFormDataCap4(formDataMasterBean, formBean);
        }
    }


    public static CtpEnumItem getEnumByCode(String itmeCode){
        if (Strings.isBlank(itmeCode)) {
            return null;
        } else {
            Long accountId = null;
            Iterator var4 = ctpEnumItemCache.findAll().iterator();

            while(var4.hasNext()) {
                CtpEnumItem entry = (CtpEnumItem)var4.next();
                if (accountId == null) {
                    if (itmeCode.equals(entry.getEnumItemCode())) {
                        return entry;
                    }
                } else if (itmeCode.equals(entry.getEnumItemCode())) {
                    return entry;
                }
            }

            return null;
        }
    }


}
